package delphorm.dao.tests;

import java.util.Properties;

import junit.framework.Assert;
import junit.framework.TestCase;

import org.hibernate.SessionFactory;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate3.LocalSessionFactoryBean;

import delphorm.dao.personne.ImplHibernateGroupeCollectif;
import delphorm.dao.personne.ImplHibernateUtilisateur;
import delphorm.entite.personne.DroitGroupe;
import delphorm.entite.personne.GroupeCollectif;
import delphorm.entite.personne.Utilisateur;

public class TestsGroupesUtilisateurs extends TestCase {
	LocalSessionFactoryBean sessionFactory;
	DriverManagerDataSource datasource;
	ImplHibernateUtilisateur daoutilisateur;
	Utilisateur utilisateur;
	ImplHibernateGroupeCollectif daogroupe;
	GroupeCollectif groupe;
	
	public static void main(String[] args) {
		junit.textui.TestRunner.run(TestsGroupesUtilisateurs.class);
	}

	protected void setUp() throws Exception {
		super.setUp();
		
		datasource = new DriverManagerDataSource();
		datasource.setDriverClassName("org.postgresql.Driver");
		datasource.setUsername("admin");
		datasource.setPassword("admin");
		datasource.setUrl("jdbc:postgresql://localhost:5432/autoformdb");
		
		sessionFactory = new LocalSessionFactoryBean();
		sessionFactory.setDataSource(datasource);
		String[] fichiersmapping = new String[]{
			"mapping/utilisateur.hbm.xml",
	        "mapping/groupe.hbm.xml",
	        "mapping/groupecollectif.hbm.xml",
	        "mapping/groupeutilisateur.hbm.xml",
	        "mapping/droitGroupe.hbm.xml"
		};
		sessionFactory.setMappingResources(fichiersmapping);
		Properties prop = new Properties();
		prop.put("hibernate.dialect","org.hibernate.dialect.PostgreSQLDialect");
		prop.put("current_session_context_class","thread");
		prop.put("show_sql","true");
		sessionFactory.setHibernateProperties(prop);
		sessionFactory.afterPropertiesSet();
		SessionFactory sf = (SessionFactory) sessionFactory.getObject();
				
		daoutilisateur = new ImplHibernateUtilisateur();
		daoutilisateur.setSessionFactory(sf);
		
		daogroupe = new ImplHibernateGroupeCollectif();
		daogroupe.setSessionFactory(sf);
		
	}

	
	
	public void testAjouterGroupeUtilisateur()
	{	
		String login = new String("jerome");
		utilisateur = daoutilisateur.getUtilisateurParLogin(login);
		Assert.assertNotNull(utilisateur);
		Assert.assertNotNull(utilisateur.getId());
		
		String nom = "groupetestcollectif";
		groupe = daogroupe.getGroupeByNom(nom);
		Assert.assertNotNull(groupe);
		Assert.assertNotNull(groupe.getId());

		
		//crée l'objet DroitGroupe et l'ajoute
		DroitGroupe dg = new DroitGroupe(null, groupe, utilisateur, new Boolean(false), new Boolean(false), new Boolean(false), new Boolean(false), new Boolean(false), new Boolean(false), new Boolean(false));
		dg = daoutilisateur.ajouterGroupeUtilisateur(dg);
		Assert.assertNotNull(dg);		
		
	}
	
	public void testAjouterGroupeUtilisateurParUtilisateur()
	{
		//charge un utilisateur
		String login = new String("jerome");
		utilisateur = daoutilisateur.getUtilisateurParLogin(login);
		Assert.assertNotNull(utilisateur);
		Assert.assertNotNull(utilisateur.getId());
		
		//charge un groupe
		String nom = "groupetestcollectif";
		groupe = daogroupe.getGroupeByNom(nom);
		Assert.assertNotNull(groupe);
		Assert.assertNotNull(groupe.getId());

		//crée un nouveau groupe
		GroupeCollectif groupe2 = new GroupeCollectif(null,"testgroup2");
		groupe2 = daogroupe.ajouterGroupe(groupe2);
		Assert.assertNotNull(groupe2);
		Assert.assertNotNull(groupe2.getId());
		
		//crée un autre objet DroitGroupe et l'ajoute à l'utilisateur
		DroitGroupe dg2 = new DroitGroupe(null, groupe2, utilisateur, new Boolean(false), new Boolean(false), new Boolean(false), new Boolean(false), new Boolean(false), new Boolean(false), new Boolean(false));
		utilisateur.getGroupes().add(dg2);
		//enregistre l'utilisateur
		utilisateur = daoutilisateur.enregistrerUtilisateur(utilisateur);
		Assert.assertNotNull(utilisateur);
		Assert.assertNotNull(utilisateur.getId());
		
		/*//supprimer le nouveau groupe
		nom = "groupetest2";
		groupe2 = daogroupe.getGroupeByNom(nom);
		Assert.assertNotNull(groupe2);
		Assert.assertNotNull(groupe2.getId());
		
		daogroupe.supprimerGroupe(groupe2);
		Groupe resg = daogroupe.getGroupeByNom(nom);
		Assert.assertNull(resg);*/
	}
}
